#pragma once

#include "logger.hpp"


namespace easylog
{
    //1. 提供获取指定日志的全局接口(避免用户自己操作单例对象)
    Logger::ptr getLogger(const std::string& name){
        return LoggerManager::getInstance().getLogger(name);
    }
    Logger::ptr rootLogger(){
        return LoggerManager::getInstance().rootLogger();
    }
    //全局接口使用的日志器
    Logger::ptr default_logger = rootLogger();
    //设置全局接口使用的日志器
    void setDefaultLogger(Logger::ptr logger){
        default_logger = logger;
    }
    template<typename... Args>
    inline void debug(Logger::fmt_str_t fmt, Args&& ...args){
        default_logger->debug(fmt, std::forward<Args>(args)...);
    }
    template<typename... Args>
    inline void info(Logger::fmt_str_t fmt, Args&& ...args){
        default_logger->info(fmt, std::forward<Args>(args)...);
    }
    template<typename... Args>
    inline void warn(Logger::fmt_str_t fmt, Args&& ...args){
        default_logger->warn(fmt, std::forward<Args>(args)...);
    }
    template<typename... Args>
    inline void error(Logger::fmt_str_t fmt, Args&& ...args){
        default_logger->error(fmt, std::forward<Args>(args)...);
    }
    template<typename... Args>
    inline void fatal(Logger::fmt_str_t fmt, Args&& ...args){
        default_logger->fatal(fmt, std::forward<Args>(args)...);
    }
    //2. 定义宏函数对日志器接口进行代理(代理模式)
    #define EASYLOG_DEBUG(fmt, ...) easylog::debug(fmt, ##__VA_ARGS__)
    #define EASYLOG_INFO( fmt, ...) easylog::info (fmt, ##__VA_ARGS__)
    #define EASYLOG_WARN( fmt, ...) easylog::warn (fmt, ##__VA_ARGS__)
    #define EASYLOG_ERROR(fmt, ...) easylog::error(fmt, ##__VA_ARGS__)
    #define EASYLOG_FATAL(fmt, ...) easylog::fatal(fmt, ##__VA_ARGS__)

    #define EASYLOG_LOGGER_DEBUG(fmt, ...) easylog::rootLogger()->debug(fmt, ##__VA_ARGS__)
    #define EASYLOG_LOGGER_INFO(fmt, ...)  easylog::rootLogger()->info(fmt, ##__VA_ARGS__)
    #define EASYLOG_LOGGER_WARN(fmt, ...)  easylog::rootLogger()->warn(fmt, ##__VA_ARGS__)
    #define EASYLOG_LOGGER_ERROR(fmt, ...) easylog::rootLogger()->error(fmt, ##__VA_ARGS__)
    #define EASYLOG_LOGGER_FATAL(fmt, ...) easylog::rootLogger()->fatal(fmt, ##__VA_ARGS__)
}
